﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace AMDev.BNET.ClientAPI.WoW
{
    [DataContract]
    public sealed class WoWCharacterStats
        : ClientObservableObject
    {
        #region Fields
        
        #region Physical

        private int strenght;
        private int agility;
        private int stamina;
        private int intellect;
        private int spirit;

        #endregion

        #region Base

        private decimal critical;
        private decimal mastery;
        private int attackPower;
        private int criticalRating;
        private int health;
        private int power;
        private String powerType;

        #endregion

        #region Defense

        private int armor;
        private decimal dodge;
        private int dodgeRating;
        private decimal block;
        private int blockRating;        
        
        #endregion

        #region Melee

        private decimal mainHandDmgMax;
        private decimal mainHandDmgMin;
        private decimal mainHandDPS;
        private decimal mainHandExpertise;
        private decimal mainHandSpeed;

        private decimal offHandDmgMax;
        private decimal offHandDmgMin;
        private decimal offHandDPS;
        private decimal offHandExpertise;
        private decimal offHandSpeed;

        #endregion

        #region Ranged

        private decimal rangedCritical;
        private decimal rangedHitPercent;
        private decimal rangedSpeed;
        private decimal rangedDamageMax;
        private decimal rangedDamageMin;
        private decimal rangedDPS;
        private decimal rangedExpertise;
        private decimal rangedHitRating;
        private int rangedAttackPower;
        private int rangedCriticalRating;
        
        #endregion

        #endregion

        #region Properties

        #region Physical

        [DataMember(Name = "str")]
        public int Strenght
        {
            get
            {
                return this.strenght;
            }
            set
            {
                this.SetProperty(ref this.strenght, value);
            }
        }        

        [DataMember(Name ="agi")]
        public int Agility
        {
            get
            {
                return this.agility;
            }
            set
            {
                this.SetProperty(ref this.agility, value);
            }
        }

        [DataMember(Name = "sta")]
        public int Stamina
        {
            get
            {
                return this.stamina;
            }
            set
            {
                this.SetProperty(ref this.stamina, value);
            }
        }

        [DataMember(Name = "int")]
        public int Intellect
        {
            get
            {
                return this.intellect;
            }
            set
            {
                this.SetProperty(ref this.intellect, value);
            }
        }

        [DataMember(Name = "spr")]
        public int Spirit
        {
            get
            {
                return this.spirit;
            }
            set
            {
                this.SetProperty(ref this.spirit, value);
            }
        }

        #endregion
                
        #region Base

        [DataMember(Name = "mastery")]
        public decimal Mastery
        {
            get
            {
                return this.mastery;            
            }
            set
            {
                this.SetProperty(ref this.mastery, value);
            }
        }
     
        [DataMember(Name="attackPower")]
        public int AttackPower
        {
            get
            {
                return this.attackPower;
            }
            set
            {
                this.SetProperty(ref this.attackPower, value);
            }
        }
              
        [DataMember(Name="crit")]
        public decimal Critical
        {
            get
            {
                return this.critical;
            }
            set
            {
                this.SetProperty(ref this.critical, value);
            }
        }

        [DataMember(Name="critRating")]
        public int CriticalRating
        {
            get
            {
                return this.criticalRating;
            }
            set
            {
                this.SetProperty(ref this.criticalRating, value);
            }
        }

        [DataMember(Name = "health")]
        public int Health
        {
            get
            {
                return this.health;
            }
            set
            {
                this.SetProperty(ref this.health, value);
            }
        }

        [DataMember(Name = "powerType")]
        public String PowerType
        {
            get
            {
                return this.powerType;
            }
            set
            {
                this.SetProperty(ref this.powerType, value);
            }
        }

        [DataMember(Name = "power", IsRequired=false)]
        public int Power
        {
            get
            {
                return this.power;
            }
            set
            {
                this.SetProperty(ref this.power, value);
            }
        }

        #endregion

        #region Defense

        [DataMember(Name = "armor")]
        public int Armor
        {
            get
            {
                return this.armor;
            }
            set
            {
                this.SetProperty(ref this.armor, value);
            }
        }

        [DataMember(Name = "dodge")]
        public decimal Dodge
        {
            get
            {
                return this.dodge;
            }
            set
            {
                this.SetProperty(ref this.dodge, value);
            }
        }

        [DataMember(Name = "dodgeRating")]
        public int DodgeRating
        {
            get
            {
                return this.dodgeRating;
            }
            set
            {
                this.SetProperty(ref this.dodgeRating, value);
            }
        }

        [DataMember(Name = "block")]
        public decimal Block
        {
            get
            {
                return this.block;
            }
            set
            {
                this.SetProperty(ref this.block, value);
            }
        }

        [DataMember(Name = "blockRating")]
        public int BlockRating
        {
            get
            {
                return this.blockRating;
            }
            set
            {
                this.SetProperty(ref this.blockRating, value);
            }
        }

        #endregion

        #region Melee

        [DataMember(Name = "mainHandDmgMax")]
        public decimal MainHandDamageMax
        {
            get
            {
                return this.mainHandDmgMax;
            }
            set
            {
                this.SetProperty(ref this.mainHandDmgMax, value);
            }
        }

        [DataMember(Name = "mainHandDmgMin")]
        public decimal MainHandDamageMin
        {
            get
            {
                return this.mainHandDmgMin;
            }
            set
            {
                this.SetProperty(ref this.mainHandDmgMin, value);
            }
        }

        [DataMember(Name = "mainHandDps")]
        public decimal MainHandDPS
        {
            get
            {
                return this.mainHandDPS;
            }
            set
            {
                this.SetProperty(ref this.mainHandDPS, value);
            }
        }

        [DataMember(Name = "mainHandExpertise")]
        public decimal MainHandExpertise
        {
            get
            {
                return this.mainHandExpertise;
            }
            set
            {
                this.SetProperty(ref this.mainHandExpertise, value);
            }
        }

        [DataMember(Name = "mainHandSpeed")]
        public decimal MainHandSpeed
        {
            get
            {
                return this.mainHandSpeed;
            }
            set
            {
                this.SetProperty(ref this.mainHandSpeed, value);
            }
        }

        [DataMember(Name = "offHandDmgMax")]
        public decimal OffHandDamageMax
        {
            get
            {
                return this.offHandDmgMax;
            }
            set
            {
                this.SetProperty(ref this.offHandDmgMax, value);
            }
        }

        [DataMember(Name = "offHandDmgMin")]
        public decimal OffHandDamageMin
        {
            get
            {
                return this.offHandDmgMin;
            }
            set
            {
                this.SetProperty(ref this.offHandDmgMin, value);
            }
        }

        [DataMember(Name = "offHandDps")]
        public decimal OffHandDPS
        {
            get
            {
                return this.offHandDPS;
            }
            set
            {
                this.SetProperty(ref this.offHandDPS, value);
            }
        }

        [DataMember(Name = "offHandExpertise")]
        public decimal OffHandExpertise
        {
            get
            {
                return this.offHandExpertise;
            }
            set
            {
                this.SetProperty(ref this.offHandExpertise, value);
            }
        }

        [DataMember(Name = "offHandSpeed")]
        public decimal OffHandSpeed
        {
            get
            {
                return this.offHandSpeed;
            }
            set
            {
                this.SetProperty(ref this.offHandSpeed, value);
            }
        }

        #endregion

        #region Ranged

        [DataMember(Name = "rangedAttackPower")]
        public int RangedAttackPower
        {
            get
            {
                return this.rangedAttackPower;
            }
            set
            {
                this.SetProperty(ref this.rangedAttackPower, value);
            }
        }

        [DataMember(Name = "rangedCrit")]
        public decimal RangedCritical
        {
            get
            {
                return this.rangedCritical;
            }
            set
            {
                this.SetProperty(ref this.rangedCritical, value);
            }
        }

        [DataMember(Name = "rangedCritRating")]
        public int RangedCriticalRating
        {
            get
            {
                return this.rangedCriticalRating;
            }
            set
            {
                this.SetProperty(ref this.rangedCriticalRating, value);
            }
        }

        [DataMember(Name = "rangedDmgMax")]
        public decimal RangedDamageMax
        {
            get
            {
                return this.rangedDamageMax;
            }
            set
            {
                this.SetProperty(ref this.rangedDamageMax, value);
            }
        }

        [DataMember(Name = "rangedDmgMin")]
        public decimal RangedDamageMin
        {
            get
            {
                return this.rangedDamageMin;
            }
            set
            {
                this.SetProperty(ref this.rangedDamageMin, value);
            }
        }

        [DataMember(Name = "rangedDps")]
        public decimal RangedDPS
        {
            get
            {
                return this.rangedDPS;
            }
            set
            {
                this.SetProperty(ref this.rangedDPS, value);
            }
        }

        [DataMember(Name = "rangedExpertise")]
        public decimal RangedExpertise
        {
            get
            {
                return this.rangedExpertise;
            }
            set
            {
                this.SetProperty(ref this.rangedExpertise, value);
            }
        }

        [DataMember(Name = "rangedHitPercent")]
        public decimal RangedHitPercent
        {
            get
            {
                return this.rangedHitPercent;
            }
            set
            {
                this.SetProperty(ref this.rangedHitPercent, value);
            }
        }

        [DataMember(Name = "rangedHitRating")]
        public decimal RangedHitRating
        {
            get
            {
                return this.rangedHitRating;
            }
            set
            {
                this.SetProperty(ref this.rangedHitRating, value);
            }
        }

        [DataMember(Name = "rangedSpeed")]
        public decimal RangedSpeed
        {
            get
            {
                return this.rangedSpeed;
            }
            set
            {
                this.SetProperty(ref this.rangedSpeed, value);
            }
        }

        #endregion

        #endregion
    }
}
